package cn.edu.wfit.common.core.utils;


import cn.edu.wfit.common.core.constant.SecurityConstants;
import cn.edu.wfit.common.core.constant.TokenConstants;
import cn.edu.wfit.common.core.text.Convert;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
import java.util.Map;

/**
 * Jwt工具类
 *
 * @author ruoyi
 */
public class JwtUtils
{
    // 该字符不能低于43个,否则报 The specified key byte array is 248 bits which is not secure enough for any JWT HMAC-SHA algorithm
    public static String secret = TokenConstants.SECRET;
    /**
     * 秘钥实例
     */
   public static final SecretKey KEY = Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8));



    // 有效期
    private static final long JWT_EXPIRE = 100* 24*60*60*1000L;  //100天
   // private static final long JWT_EXPIRE =  24*60*60*1000L;  //1天
    //private static final long JWT_EXPIRE = 60*1000L;  //1 分钟

    /**
     * 从数据声明生成令牌
     *
     * @param claims 数据声明
     * @return 令牌
     */
    public static String createToken(Map<String, Object> claims){
       // String token = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS256, secret.getBytes(StandardCharsets.UTF_8)).compact();
       // long currentTime = System.currentTimeMillis();
        // 过期时间
       // long expTime = currentTime+JWT_EXPIRE;
       // return   Jwts.builder().claims(claims).signWith(KEY).issuedAt(new Date(currentTime)).expiration(new Date(expTime)).compact();
        return   Jwts.builder().claims(claims).signWith(KEY).compact();

    }

/*    public static String createToken(String userId) throws NoSuchAlgorithmException {
        long currentTime = System.currentTimeMillis();
        // 过期时间
        long expTime = currentTime+JWT_EXPIRE;

        return   Jwts.builder().subject(userId).signWith(KEY).issuedAt(new Date(currentTime)).expiration(new Date(expTime)).compact();

    }*/

    /**
     * 从令牌中获取数据声明
     *
     * @param token 令牌
     * @return 数据声明
     */
    public static Claims parseToken(String token)
    {
        return Jwts.parser().verifyWith(KEY).build().parseSignedClaims(token).getPayload();
    }

    /**
     * 根据令牌获取用户标识
     * 
     * @param token 令牌
     * @return 用户ID
     */
    public static String getUserKey(String token)
    {
        Claims claims = parseToken(token);
        return getValue(claims, SecurityConstants.USER_KEY);
    }

    /**
     * 根据令牌获取用户标识
     * 
     * @param claims 身份信息
     * @return 用户ID
     */
    public static String getUserKey(Claims claims)
    {
        return getValue(claims, SecurityConstants.USER_KEY);
    }

    /**
     * 根据令牌获取用户ID
     * 
     * @param token 令牌
     * @return 用户ID
     */
/*    public static String getSubject(String token)
    {
        Claims claims = parseToken(token);

        return claims.getSubject();
       // return getValue(claims, SecurityConstants.DETAILS_USER_ID);
    }*/
    public static String getUserId(String token)
    {
        Claims claims = parseToken(token);
        return getValue(claims, SecurityConstants.DETAILS_USER_ID);
    }

    /**
     * 根据身份信息获取用户ID
     * 
     * @param claims 身份信息
     * @return 用户ID
     */
    public static String getUserId(Claims claims)
    {
        return getValue(claims, SecurityConstants.DETAILS_USER_ID);
    }

    /**
     * 根据令牌获取用户名
     * 
     * @param token 令牌
     * @return 用户名
     */
    public static String getUserName(String token)
    {
        Claims claims = parseToken(token);
        return getValue(claims, SecurityConstants.DETAILS_USERNAME);
    }

    /**
     * 根据身份信息获取用户名
     * 
     * @param claims 身份信息
     * @return 用户名
     */
    public static String getUserName(Claims claims)
    {
        return getValue(claims, SecurityConstants.DETAILS_USERNAME);
    }
    /**
     * 根据令牌获取昵称/真实姓名
     *
     * @param token 令牌
     * @return 用户名
     */
    public static String getNickName(String token)
    {
        Claims claims = parseToken(token);
        return getValue(claims, SecurityConstants.DETAILS_NICKNAME);
    }

    /**
     * 根据身份信息获取昵称/真实姓名
     *
     * @param claims 身份信息
     * @return 用户名
     */
    public static String getNickName(Claims claims)
    {
        return getValue(claims, SecurityConstants.DETAILS_NICKNAME);
    }
    /**
     * 根据令牌获取用户类型
     *
     * @param token 令牌
     * @return 用户类型
     */
    public static String getUserType(String token)
    {
        Claims claims = parseToken(token);
        return getValue(claims, SecurityConstants.DETAILS_USER_TYPE);
    }

    /**
     * 根据用户类型
     *
     * @param claims 身份信息
     * @return 用户类型
     */
    public static String getUserType(Claims claims)
    {
        return getValue(claims, SecurityConstants.DETAILS_USER_TYPE);
    }

    /**
     * 根据身份信息获取键值
     * 
     * @param claims 身份信息
     * @param key 键
     * @return 值
     */
    public static String getValue(Claims claims, String key)
    {
        return Convert.toStr(claims.get(key), "");
    }
}
